跳到主要内容

Scrapy 学习

前言

之前用写 NodeJS写的爬虫感谢效率太低了,所以尝试一下这个爬虫框架,算是熟悉一下 Python 的项目结构

配置环境

pip install scrapy

# 安装好之后,测试是否能运行
scrapy bench
# 创建项目
scrapy startproject 项目名

# 生成爬虫,爬虫名不能和项目一样(这个 gen 是 generate:产生 的意思)
scrapy genspider 爬虫名 被扒域名
# 例:scrapy genspider study01 ssr1.scrape.center

然后就会自动生成这个文件

# -*- coding:utf-8 -*-
import scrapy


# 创建爬虫类,并且继承 scrapy.Spider
class Study01Spider(scrapy.Spider):
name = 'study01' # 名字必须唯一
allowed_domains = ['ssr1.scrape.center'] # 允许采集的域名
start_urls = ['http://ssr1.scrape.center/'] # 开始采集的网站

# 解析响应数据
def parse(self, response):
pass

注意:这里 parse 父类方法会抛出错误,目的是防止用户自己写的 Spider 没有覆盖这个方法,当没有覆盖这个方法时会自动抛出这个错误

def parse(self, response, **kwargs):
raise NotImplementedError('{}.parse callback is not defined'.format(self.__class__.__name__))

然后进入 settings.py 里把 ROBOTSTXT_OBEY 改成 False(大写) 这个 ROBOTSTXT_OBEY 是一个反爬协议,开启了就表示遵守这个协议,哪些字段不能爬取 一般在网站根目录下的 robots.txt 文件 例如:

https://www.nike.com/robots.txt

Disallow 表示不可以爬
Allow 表示可以爬

启动爬虫

# 启动
scrapy crawl 爬虫名

设置日志

因为默认的日志打印一堆看着有点烦,实际上这个日志是可以关的

同样在 settings.py 里加上 LOG_LEVEL = "WARNING" 设置日志等级为警告及以上才显示

如果要使用日志的话可以引入日志模块

import logging


logging.info('测试 INFO')
logging.warning('测试 WARING')
logging.debug('测试 DEBUG')
logging.error('测试 ERROR')


# 或者在使用前加上调用者名字,日志就能显示调用的类名了
logger = logging.getLogger(__name__)

logger.warning('测试')

可以把日志输出到某个地方 在 settings.py 里加上 LOG_FILE = "./temp.log"

搭建一个服务

直接上来就去拿各种网站练手效率太低了,所以这里可以先搭建一个 NodeJS 服务

但是注意:如果要测试代理的话最好把这个部署到远程服务器上去

# 初始化项目
npm init

# 下载依赖
npm install express --save

编写服务

// 引入模块
const express = require('express')

// 创建网站服务器
const app = express();

// 如果是 / 表示这个是根项目(和javaWeb 一样)
app.get('/',(req,res)=>{
// 响应方法是 send() 能够自动把 响应类型、类型编码、http状态码 等信息写到响应头里
console.log('==================请求头====================');
console.log(req.headers);
console.log('==================响应头====================');
console.log(res.getHeaders());
console.log('==================IP地址====================');
let getClientIp = function (req) {
return req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress || '';
};

console.log(getClientIp(req));
res.send('Hello Express !');
})

// 监听端口
app.listen(3000);
console.log('网站服务器启动成功');
# 启动服务
node .\main.js

# 访问 http://localhost:3000/

编写脚本:

import scrapy


class TestspiderSpider(scrapy.Spider):
name = 'testSpider'
allowed_domains = ['localhost']
start_urls = ['http://localhost:3000/']

def parse(self, response):
print(response)


if __name__ == '__main__':
from scrapy import cmdline

cmdline.execute("scrapy crawl testSpider".split())

Reference